perm filename XAP2[XAP,BGB] blob
sn#058608 filedate 1973-08-21 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001 VALID 00006 PAGES
C00002 00002 SUBR(MKSEG0) MAKE LINE SEGMENT. CLIPPER.
C00005 00003 SUBR(MKSEG1) MAKE LINE SEGMENT.
C00008 00004 SUBR(IIISIM) OUTPUT III BUFFER ONTO XGP.
C00010 00005 FETCH AND DECODE III COMMAND WORD.
C00012 00006 EXECUTE VECTORS.
C00015 00007 SUBR(VIDEO)
C00018 ENDMK
C⊗;
SUBR(MKSEG0) MAKE LINE SEGMENT. CLIPPER.
BEGIN MKSEG0;_____________________________________________________
ACCUMULATORS{R1,C1,R2,C2,Q,N}
;TEST FOR EASY OUTSIDER.
LAC Q,C1↔LAC N,C2↔CAMLE C1,C2↔EXCH Q,N
CAIG Q,=1727↔SKIPGE N↔POP0J
LAC Q,R1↔LAC N,R2↔CAMLE R1,R2↔EXCH Q,N
CAMG Q,QHI↔CAMGE N,QLO↔POP0J
;TEST FOR EASY INSIDER.
JUMPL C1,L1↔JUMPL C2,L1
CAILE C1,=1727↔GO L1↔CAILE C2,=1727↔GO L1
CAMLE R1,QHI↔GO L1↔CAMLE R2,QHI↔GO L1
CAMGE R1,QLO↔GO L1↔CAMGE R2,QLO↔GO L1↔GO MKSEG1 ;DISPLAY.
;TEST FOR AND HANDLE SIMPLE CASES.
L1: CAMN R1,R2↔GO[
CAMN C1,C2↔POP0J↔GO HSEG]
CAMN C1,C2↔GO VSEG
;MIDPOINT THE HARD CASE.
PUSH P,R1↔PUSH P,C1 ;SAVE 1ST END.
ADD R1,R2↔ASH R1,-1 ;MIDPOINT THE LINE SEGMENT.
ADD C1,C2↔ASH C1,-1
;TEST FOR MIDPOINT AND 1ST END BEING COINCIDANT.
CAMN R1,-1(P)↔GO[
CAME C1, 0(P)↔GO .+1↔POP P,C1↔POP P,R1↔POP0J]
;RECURSION - DISPLAY ONE HALF AND THEN DISPLAY THE OTHER.
CALL(MKSEG0) ;MIDPOINT TO 2ND END.
LAC R2,-1(P)↔LAC C2,0(P)
CALL(MKSEG0) ;MIDPOINT TO 1ST END.
POP P,C1↔POP P,R1↔POP0J
;DISPLAY HORIZONTAL LINE SEGMENT FROM (C1 MIN C2) TO (C1 MAX C2).
HSEG: LAC Q,C1↔LAC N,C2↔CAML C1,C2↔EXCH N,Q
SKIPGE Q↔SETZ Q,↔CAILE N,=1727↔LACI N,=1727↔SUB N,Q
DOT(R1,Q)↔SKIPA↔IDPB 0,1↔SOJG N,.-1↔POP0J
;DISPLAY VERTICAL LINE SEGMENT FROM (R1 MIN R2) TO (R1 MAX R2).
VSEG: LAC Q,R1↔LAC N,R2↔CAML R1,R2↔EXCH N,Q
CAMGE Q,QLO↔LAC Q,QLO↔CAMLE N,QHI↔LAC N,QHI↔SUB N,Q
DOT(Q,C1)↔ADDI 1,WWIDTH
SOJG N,.-2↔POP0J
BEND MKSEG0;BGB 24 APRIL 1973.____________________________________
SUBR(MKSEG1) MAKE LINE SEGMENT.
COMMENT / Recursive midpoint method of quantizing a line segment.
Arguments are expected in accumulators R1, C1, R2, C2; the bit
is deposited from accumulator 0./
BEGIN MKSEG1;_____________________________________________________
ACCUMULATORS{R1,C1,R2,C2,Q,N}
;TEST FOR AND HANDLE SIMPLE CASES.
CAMN R1,R2↔GO[
CAMN C1,C2↔GO[DOT(R1,C1)↔POP0J]↔GO HSEG]
CAMN C1,C2↔GO VSEG
;MIDPOINT THE HARD CASE.
PUSH P,R1↔PUSH P,C1 ;SAVE 1ST END.
ADD R1,R2↔ASH R1,-1 ;MIDPOINT THE LINE SEGMENT.
ADD C1,C2↔ASH C1,-1
;TEST FOR MIDPOINT AND 1ST END BEING COINCIDANT.
CAMN R1,-1(P)↔GO[
CAME C1, 0(P)↔GO .+1↔POP P,C1↔POP P,R1
DOT(R1,C1)↔DOT(R2,C2)↔POP0J]
;RECURSION - DISPLAY ONE HALF AND THEN DISPLAY THE OTHER.
CALL(MKSEG1) ;MIDPOINT TO 2ND END.
LAC R2,-1(P)↔LAC C2,0(P)
CALL(MKSEG1) ;MIDPOINT TO 1ST END.
POP P,C1↔POP P,R1↔POP0J
;DISPLAY HORIZONTAL LINE SEGMENT FROM (C1 MIN C2) TO (C1 MAX C2).
HSEG: LAC Q,C1↔LAC N,C2
CAML C1,C2↔EXCH N,Q↔SUB N,Q
DOT(R1,Q)↔SKIPA↔IDPB 0,1
SOJG N,.-1↔POP0J
;DISPLAY VERTICAL LINE SEGMENT FROM (R1 MIN R2) TO (R1 MAX R2).
VSEG: LAC Q,R1↔LAC N,R2
CAML R1,R2↔EXCH N,Q↔SUB N,Q
DOT(Q,C1)↔ADDI 1,WWIDTH
SOJG N,.-2↔POP0J
BEND MKSEG1;BGB 24 APRIL 1973.____________________________________
SUBR(IIISIM) OUTPUT III BUFFER ONTO XGP.
BEGIN IIISIM______________________________________________________
ACCUMULATORS{X,Y,R,C,IIIWRD}
;DELTA ORIGIN DISPLACEMENT.
SLACI 1,(2B2)↔LAC CHAR
CAIN"*"↔SETZ 1,↔DAC 1,DELTA#
;III FILE NAME.
CALL(GETFIL)
INIT 17,17↔SIXBIT/DSK/↔0
GO[FATAL(CAN'T INIT DSK)]
LOOKUP 17,FILNAM↔GO[LAC[SIXBIT/PLT/]↔DAC EXTION
LOOKUP 17,FILNAM↔GO[LAC[SIXBIT/III/]↔DAC EXTION
LOOKUP 17,FILNAM↔GO[LAC[SIXBIT/DAT/]↔DAC EXTION
LOOKUP 17,FILNAM↔GO[FATAL<III FILE NOT FOUND.>]
GO L0]↔GO L0]↔GO L0]
;EXPAND CORE FOR DUMP INPUT.
L0: LAC JOBREL↔DAC OLD44#
NIP 1,PPPN↔MOVN 1,1
ADD 1,JOBREL↔DAC 1,BUFEND#
CORE 1,↔GO[FATAL(CAN'T EXPAND CORE)]
;SAVE CURRENT XGP BEAM POSITION.
LAC COL↔DAC BEGCOL#
LAC ROW↔DAC BEGROW#
;DUMP III FILE IN.
LAC OLD44↔ADDM PPPN↔IN 17,PPPN
LAC 1,OLD44↔LAC(1)↔CAMN[-1]↔GO VIDEO
LAC 1,OLD44↔ADDI 1,2↔DAC 1,PC# ;III PC.
L1: CDR 1,BUFEND↔DZM -1(1)↔DZM(1)
CAML 1,JOBREL↔GO .+3
LIPI 1,-1(1)↔BLT 1,JOBREL ;CLEAR TOP.
;FETCH AND DECODE III COMMAND WORD.
ILOOP: AOSA 1,PC
LOOP: LAC 1,PC↔CAMLE 1,JOBFF
CAML 1,BUFEND↔GO RET
LAC IIIWRD,(1)
TRNE IIIWRD,01↔GO XTEXT ;TEXT COMMAND WORD.
TRNE IIIWRD,02↔GO XVECTR ;VECTOR COMMAND WORD.
TRNE IIIWRD,20↔GO XCTRL ;III CONTROL WORD.
TRNE IIIWRD,37↔GO ILOOP ;NOP & HALT COMMANDS.
RET: LAC OLD44↔CORE↔GO[FATAL(CAN'T SHRINK CORE!)]
FRET: RELEASE 17,
LAC BEGCOL↔DAC COL
LAC BEGROW↔DAC ROW
POP0J
;EXECUTE III TEXT.
XTEXT: PUSH P,IIIWRD ;-2(P)
PUSH P,[5] ;-1(P)
PUSH P,[POINT 7,-2(P)] ; 0(P)
CLOOP: ILDB 1,0(P)
JUMPE 1,CCONT
CAIN 1,15↔GO[LAC -4(P)↔DAC COL↔GO CCONT]
DAC 1,CHAR
CALL(PRINT)
CCONT: SOSLE -1(P)↔GO CLOOP
SUB P,[XWD 3,3]
GO ILOOP
;EXECUTE III CONTROL OPERATIONS.
XCTRL: TRNN IIIWRD,04↔GO[CAR 1,IIIWRD↔DAC 1,PC↔GO LOOP] ;JUMP.
TRNE IIIWRD,40↔GO LOOP ;SAVE A NOP HERE
AOS 1,PC ;JSR
HRLI 1,20
CAR 2,IIIWRD
CAMLE 2,JOBFF
CAML 2,BUFEND↔GO[ OUTSTR[ASCIZ/JSR OUT OF BOUNDS
/]↔ GO RET]
DAC 1,(2)↔DAC 2,PC
GO ILOOP
;EXECUTE VECTORS.
XVECTR: TRNN IIIWRD,4
GO [TRNN IIIWRD,10 ;SHORT VECTOR OR TSS
GO SVECT ;SHORT VECTOR
GO ILOOP] ;TSS
LDB [POINT 11,IIIWRD,10]↔ROT -13↔DAC X ;X FIELD.
LDB [POINT 11,IIIWRD,21]↔ROT -13↔DAC Y ;Y FIELD
LDB 1,[POINT 3,IIIWRD,31]↔CALL(VECTOR) ;OP CODE.
GO ILOOP
SVECT: PUSH P,IIIWRD ;SAVE III COMMAND.
LDB [POINT 7,IIIWRD,06]↔ROT -7↔ASH -4↔DAC X ;X FIELD.
LDB [POINT 7,IIIWRD,13]↔ROT -7↔ASH -4↔DAC Y ;Y FIELD.
LDB 1,[POINT 2,IIIWRD,15]↔CALL(VECTOR) ;OP CODE.
POP P,IIIWRD ;RESTORE III COMMAND.
LDB [POINT 7,IIIWRD,22]↔ROT -7↔ASH -4↔DAC X ;X FIELD.
LDB [POINT 7,IIIWRD,29]↔ROT -7↔ASH -4↔DAC Y ;Y FIELD.
LDB 1,[POINT 2,IIIWRD,31]↔CALL(VECTOR) ;OP CODE.
GO ILOOP
VECTOR: SETO↔TRNE 1,2↔SETZ ;SKIP ON VISIBLE VECTOR.
TRNE 1,4↔GO .+3 ;SKIP ON RELATIVE VECTOR.
ADD X,XBEAM↔ADD Y,YBEAM
DAC X,XBEAM↔DAC Y,YBEAM
LACN R,Y↔ADD R,DELTA↔MUL R,IIIDY↔ADD R,BEGROW ;Y INTO ROW.
LAC C,X↔ADD C,DELTA↔MUL C,IIIDX↔ADD C,BEGCOL ;X INTO COL.
TRNN 1,1↔GO .+4 ;SKIP ON POINT.
LAC 2,R↔LAC 3,C↔GO .+3 ;POINT.
LAC 2,ROW↔LAC 3,COL ;FROM OLD XGP BEAM POSITION.
DAC R,ROW↔DAC C,COL ;SAVE NEW XGP BEAM POSITION.
SKIPE↔CALL(MKSEG0)↔POP0J ;PLOT VECTOR - POP STACK.
DECLARE{XBEAM,YBEAM}
BEND IIISIM;2/8/73(TVR)8/21/73(BGB)----------------------------------
SUBR(VIDEO)
BEGIN VIDEO;_________________________________________________________
ACCUMULATORS{S2,S3,I,J,K,Q,P1,P2,R,C,TV}
COMMENT⊗ VIDEO FILE HEADER:
0 -1
1 6 BITS PER BYTE.
2 =48 WORDS PER ROW.
3 R1
4 R2
5 C1
6 C2
7 -WC,,ADR ⊗
;EXPECT AC-1 TO CONTAIN POINTER TO WORD ZERO OF VIDEO FILE IN CORE.
LAC TV,1↔LAC 2(TV)↔DAC TVWIDTH#
LAC 4(TV)↔SUB 3(TV)↔AOS↔DAC TVROWS#↔DZM TVROW0#
LAC 6(TV)↔SUB 5(TV)↔AOS↔DAC TVCOLS#
LAC R,ROW↔TRZ R,3 ;UPPER LEFT MOST CORNER OF IMAGE.
CAMLE R,QHI↔POP0J ;WHOLE VIDEO IMAGE BELOW THIS QPAGE.
CAML R,QLO↔GO L0 ;VIDEO IMAGE STARTS ON THIS QPAGE.
;VIDEO IMAGE STARTS BEFORE THIS QUARTER PAGE.
L00: SUB R,QLO↔ASH R,-2
MOVM R,R↔DAC R,TVROW0#
CAML R,TVROWS↔POP0J ;WHOLE VIDEO IMAGE ABOVE THIS QPAGE.
SUB R,TVROWS
DACM R,TVROWS↔LAC R,QLO
;VIDEO BYTE POINTER.
L0: LAC P1,1(TV) ;BYTE SIZE.
IORI P1,4400↔ROT P1,-=12
LAP P1,7(TV)↔ADD P1,1 ;ORIGIN OF VIDEO IN CORE.
LAC TVROW0↔IMUL TVWIDTH↔ADD P1,0
;POINTER INTO XGP BUFFER.
LAC C,COL
HLLZ 1,%(C)↔ROT 1,6
HRRI 1,@%(R)↔CDR P2,1
;J = COLUMNS/9 9 4-BIT XGP BYTES PER WORD.
LACI J,=36↔IDIV J,1(TV)
IMUL J,2(TV)↔IDIVI J,=9↔DAC J,JSAV# ;COLUMNS/9
LAC I,TVROWS
L1: DAC P2,P2SAV#↔LAC J,JSAV
L2: SETZB 0,1↔SETZB 2,3↔LACI K,=9
L3: ILDB Q,P1
TRZ Q,3↔ROTC 0,4↔ROTC 2,4
IOR 0,HTT+0(Q)↔IOR 1,HTT+1(Q)
IOR 2,HTT+2(Q)↔IOR 3,HTT+3(Q)↔SOJG K,L3
CAIL C,=1728↔GO L4
IORM 0,0*WWIDTH(P2)↔IORM 1,1*WWIDTH(P2)
IORM 2,2*WWIDTH(P2)↔IORM 3,3*WWIDTH(P2)
L4: AOS P2↔SOJG J,L2
ADDI R,4↔CAMLE R,QHI↔POP0J
LAC P2,P2SAV↔ADDI P2,4*WWIDTH
SOJG I,L1
POP0J
;HALF TONE TABLE.
HTT: 6↔7↔7↔6↔ 6↔6↔7↔6↔ 6↔6↔6↔6↔ 6↔6↔6↔6
6↔6↔6↔4↔ 4↔6↔6↔4↔ 4↔6↔6↔4↔ 4↔4↔6↔4
4↔4↔4↔4↔ 4↔4↔4↔4↔ 0↔4↔4↔4↔ 4↔4↔4↔0
0↔4↔4↔0↔ 0↔0↔4↔0↔ 0↔0↔4↔0↔ 0↔0↔0↔0
BEND VIDEO;BGB 2 JUNE 1973.__________________________________________